#ifndef KLIB_H__
#define KLIB_H__

#include <am.h>
#include <stddef.h>
#include <stdarg.h>
//#define __NATIVE_USE_KLIB__ 1

#ifdef __cplusplus
extern "C" {
#endif

// string.h
void  *memset			(void *s, int c, size_t n);
void  *memcpy			(void *dst, const void *src, size_t n);
void  *memmove			(void *dst, const void *src, size_t n);
int    memcmp			(const void *s1, const void *s2, size_t n);
size_t strlen			(const char *s);
char  *strcat			(char *dst, const char *src);
char  *strcpy			(char *dst, const char *src);
char  *strncpy			(char *dst, const char *src, size_t n);
int    strcmp			(const char *s1, const char *s2);
int    strncmp			(const char *s1, const char *s2, size_t n);
void   str_rev			(char* str,int len);
void   ch_swap			(char* a,char* b);
void   chrgen_klib		(char* out,char ch,int cnt);
char* width_align_klib	(char* str,char* text,int text_cnt,int cnt,char style,char oriention,int* result);




// stdlib.h
void   srand     (unsigned int seed);
int    rand      (void);
void  *malloc    (size_t size);
void   free      (void *ptr);
int    abs       (int x);
int    atoi      (const char *nptr);
int  itoa_klib   (int num, char* str, int v);


// stdio.h
int    printf    (const char *format, ...);
int    sprintf   (char *str, const char *format, ...);
int    snprintf  (char *str, size_t size, const char *format, ...);
int    vsprintf  (char *str, const char *format, va_list ap);
int    vsnprintf (char *str, size_t size, const char *format, va_list ap);
//void   putstr	 (char* str);


// assert.h
#ifdef NDEBUG
  #define assert(ignore) ((void)0)
#else
  #define assert(cond) \
    do { \
      if (!(cond)) { \
        printf("Assertion fail at %s:%d\n", __FILE__, __LINE__); \
        halt(1); \
      } \
    } while (0)
#endif

#ifdef __cplusplus
}
#endif

#endif
